package org.practice.intercepter;


import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.config.DefaultSettings;
import org.practice.action.BaseAction;
import org.practice.util.Constant;
import org.practice.util.IAnonymous;
import org.practice.util.PropertiesUtil;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
 * @author jack
 * 过滤器:在servlet容器启动时调用一次，以后对request,response过滤掉一些信息或者提前设置一些参数(比如过滤掉非法url,设置字符集编码等)，然后再执行 action，由链栈维护其回调过程。
 * 拦截器：是面向切面编程的运用，在执行Action时切入其它业务逻辑。 
 * 在action的生命周期中，拦截器可以多次被调用，而过滤器只能在容器初始化时被调用一次 ，执行顺序 ：过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
 * 拦截器与过滤器的区别 ：
 * 拦截器是基于java的反射机制的，是AOP编程的运用，而过滤器是基于函数回调。 
 * 拦截器不依赖与servlet容器，过滤器依赖与servlet容器。 
 * 拦截器只能对action请求起作用，而过滤器则可以对几乎所有的请求起作用（比如直接请求jsp，拦截器就不起作用）。 
 * 拦截器可以访问action上下文、值栈里的对象，而过滤器不能访问。 
 */
public class ActionTimeInterceptor implements Interceptor{

	public void destroy() {
		
	}

	public void init() {
		
	}
	/**
     * ActionContext对象是Action执行的上下文，实例化ActionContext.getContext()
     */
	public String intercept(ActionInvocation invocation) {
		//使用XStream将JavaBean、Map、List序列化为XML
        XStream xStream = new XStream(new DomDriver());
        xStream.autodetectAnnotations(true);
		
		BaseAction baseAction = (BaseAction)invocation.getAction();
		boolean flag = PropertiesUtil.isNeedActionTime();
        if(!flag){
            return null;
        }
        //如果是调试模式，不处理，struts.devMode=false
	    long actionTime = 0L;
	    try{
	    	actionTime = System.currentTimeMillis();
	        HttpServletRequest request = ServletActionContext.getRequest();
	        Enumeration enu = request.getParameterNames();
	        StringBuffer params = new StringBuffer();
	        Map map = new LinkedHashMap();
	        while (enu.hasMoreElements()) {
	            String obj = (String) enu.nextElement();
	            Object value = request.getParameter(obj);
	            params.append(obj);
	            params.append(":");
	            params.append(value);
	            params.append(";");
	            map.put(obj, value);
	        }
	        boolean isPrint = PropertiesUtil.isNeedPrintParam();
	        if (isPrint) {
	            String paramXml = xStream.toXML(map);
	            System.out.println("request-parameter:"+paramXml);
	        }
	    	
	    	String result = invocation.invoke();
	    	
	    	Enumeration enu2 = request.getSession().getAttributeNames();
	        Map sessionMap = new LinkedHashMap();
	        while (enu2.hasMoreElements()) {
	            String obj2 = (String) enu2.nextElement();
                Object value = request.getSession().getAttribute(obj2);
                sessionMap.put(obj2, value);
	        }
	        if (isPrint) {
	            String paramXml = xStream.toXML(sessionMap);
	            System.out.println("session-scope:"+paramXml);
	        }
	    	actionTime = System.currentTimeMillis() - actionTime;
	    	System.out.println("action执行时间 = " + actionTime + "毫秒");
	    	return result;
	    } catch (Exception e) {
	    	baseAction.addActionMessage("自定义提示信息。。。。");
	    	baseAction.addActionMessage(e.toString());
	    	return Constant.ACTION_EXCEPTION;
	    }
	}
 
}